#include"Acceptor.h"
#include"InetAddress.h"
#include"Logger.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include <errno.h>

static int createNonblocking()//防止跟其他文件的函数重名，使用static修饰，创建非阻塞io
{
    int sockfd=::socket(AF_INET,SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC,0);
    if(sockfd<0)
    {
        LOG_FATAL("%s:%s:%d listen socket create err:%d \n",__FILE__,__FUNCTION__,__LINE__,errno);
    }
    return sockfd;
}

Acceptor::Acceptor(Eventloop *loop,const InetAddress &listenAddr,bool reuseport)
    :loop_(loop)
    ,acceptSocket_(createNonblocking())//创建套接字
    ,acceptChannel_(loop,acceptSocket_.fd())//// Channel 关联 fd 和 EventLoop
    ,listening_(false)
    {
        acceptSocket_.setReuseAddr(true);
        acceptSocket_.setReusePort(true);
        acceptSocket_.bindAddress(listenAddr);//绑定套接字
        acceptChannel_.setReadCallback(std::bind(&Acceptor::handleRead,this));//// 设置可读事件回调
    }
Acceptor::~Acceptor()
{
    acceptChannel_.disableAll(); // 停止监听所有事件
    acceptChannel_.remove();// 从 EventLoop 的 poller 中移除
}

void Acceptor::listen()
{
    listening_=true;
    acceptSocket_.listen(); // 调用 ::listen()
    acceptChannel_.enableReading();// 向 EventLoop 注册可读事件
}

void Acceptor::handleRead()
{
    InetAddress peerAddr;
    int connfd=acceptSocket_.accept(&peerAddr);// 接受新连接
    if(connfd>=0)
    {
        if(newConnectionCallback_)
        {
            newConnectionCallback_(connfd,peerAddr); // 回调上层 轮询找到subLoop，唤醒，分发当前的新客户端的Channel
        }
        else
        {
            ::close(connfd); // 没有回调，直接关闭（安全兜底）
        }
    }
    else
    {
        LOG_ERROR("%s:%s:%d accept err:%d \n",__FILE__,__FUNCTION__,__LINE__,errno);
        if(errno==EMFILE)
        {
            LOG_ERROR("%s:%s:%d sockfd reached limit \n",__FILE__,__FUNCTION__,__LINE__);
        }   
    }
}